From: Marco Trevisan (TreviƱo) Date: Tue, 16 Feb 2021 01:00:41 +0000 (+0100) Subject: gdm: Keep messages in queue until we've not fully processed them X-Git-Tag: archive/raspbian/50.5-1+rpi1~1^2~616^2^2~322 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=ef10bb6229ceb323822f27a436c5f3ce9ba12696;p=gnome-shell.git gdm: Keep messages in queue until we've not fully processed them It can be convenient to get the currently showing message in order to replace or remove it in case it's not needed anymore. So simplify the message queue handling by only depending on a single local variable (_messageQueue) and redefining hasPendingMessages depending on its content. Now messages are kept in queue till they are not fully processed and the first message is always the one currently shown. Part-of: --- diff --git a/js/gdm/util.js b/js/gdm/util.js index 369c0bb33..16689f10e 100644 --- a/js/gdm/util.js +++ b/js/gdm/util.js @@ -172,7 +172,6 @@ var ShellUserVerifier = class { this._messageQueue = []; this._messageQueueTimeoutId = 0; - this.hasPendingMessages = false; this.reauthenticating = false; this._failCounter = 0; @@ -194,10 +193,18 @@ var ShellUserVerifier = class { } } + get hasPendingMessages() { + return !!this._messageQueue.length; + } + get allowedFailures() { return this._settings.get_int(ALLOWED_FAILURES_KEY); } + get currentMessage() { + return this._messageQueue ? this._messageQueue[0] : null; + } + begin(userName, hold) { this._cancellable = new Gio.Cancellable(); this._hold = hold; @@ -283,7 +290,6 @@ var ShellUserVerifier = class { this._messageQueue = []; - this.hasPendingMessages = false; this.emit('no-more-messages'); } @@ -293,33 +299,33 @@ var ShellUserVerifier = class { } _queueMessageTimeout() { - if (this._messageQueue.length == 0) { - this.finishMessageQueue(); - return; - } - if (this._messageQueueTimeoutId != 0) return; - let message = this._messageQueue.shift(); + const message = this.currentMessage; delete this._currentMessageExtraInterval; this.emit('show-message', message.serviceName, message.text, message.type); this._messageQueueTimeoutId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, - message.interval + (this._currentMessageExtraInterval | 0), - () => { - this._messageQueueTimeoutId = 0; - this._queueMessageTimeout(); - return GLib.SOURCE_REMOVE; - }); + message.interval + (this._currentMessageExtraInterval | 0), () => { + this._messageQueueTimeoutId = 0; + + if (this._messageQueue.length > 1) { + this._messageQueue.shift(); + this._queueMessageTimeout(); + } else { + this.finishMessageQueue(); + } + + return GLib.SOURCE_REMOVE; + }); GLib.Source.set_name_by_id(this._messageQueueTimeoutId, '[gnome-shell] this._queueMessageTimeout'); } _queueMessage(serviceName, message, messageType) { let interval = this._getIntervalForMessage(message); - this.hasPendingMessages = true; this._messageQueue.push({ serviceName, text: message, type: messageType, interval }); this._queueMessageTimeout(); }